package com.zhongge.arrayOJ;


import java.util.Iterator;
import java.util.LinkedList;

/**
 * @ClassName RotateArray
 * @Description TODO 轮转数组
 * @Author 笨忠
 * @Date 2025/8/8 15:52
 * @Version 1.0
 */
public class RotateArray {
    public static int[] rotate1(int[] nums, int k) {
        k %= nums.length;
        //打算使用数据结构来完成本题的算法
        LinkedList<Integer> list = new LinkedList<>();
        //先将所有方法都搞到集合中
        for (int i = 0; i < nums.length; i++) {
            list.add(nums[i]);
        }
        //接下来就只需要尾删和头插k次
        while (k > 0) {
            //尾删
            int tmp = list.removeLast();//自动拆箱
            //头插
            list.addFirst(tmp);//自动装箱
            k--;
        }
        //最后将值存储到nums中
        //使用迭代器 防止出现复杂度是n的平凡
        Iterator<Integer> iterator = list.iterator();
        int i = 0;
        while (iterator.hasNext()) {
            nums[i++] = iterator.next();
        }
//        for (int i = 0; i < nums.length; i++) {
//            nums[i] = list.get(i);
//        }
        return nums;
    }
    /**
     * 会出现超时情况==》此时需要我们合理的应用数据结构
     * @param nums
     * @param k
     * @return
     */
    public static int[] rotate(int[] nums, int k) {
        //new出一个同样大小的辅助数组==》空间换时间
        int[] tmps = new int[nums.length];
        //轮换k次
        while (k > 0) {
            int i = 0;//标记nums
            int j = 0;//标记tmp
            tmps[j] = nums[nums.length - 1];
            for (i = 0, j = 1; i < nums.length - 1; i++, j++) {
                tmps[j] = nums[i];
            }
            //最后再将tmps中的值给赋值到nums中去
            for (int l = 0; l < nums.length; l++) {
                nums[l] = tmps[l];
            }
            k -- ;
        }
        return nums;
    }

    public static void main(String[] args) {
        int[] nums = {1,2,3,4,5,6,7};
        int k = 3;
//        int[] tmps = rotate(nums, k);
//        for (int i = 0; i < tmps.length; i++) {
//            System.out.print(tmps[i] + " ");
//        }
//        System.out.println();
        int[] tmps1 = rotate1(nums, k);
        for (int i = 0; i < tmps1.length; i++) {
            System.out.print(tmps1[i] + " ");
        }
        System.out.println();
    }
}
